#ifndef UART_OTA_H
#define UART_OTA_H

#include "gd32f4xx.h"
#include "gd32f4xx_gpio.h"
#include "gd32f4xx_rcu.h"
#include "gd32f4xx_usart.h"
#include "systick.h"
#include "boot_update.h"
#include <stdio.h>

/* 定义缓冲区大小 */
#define BUFFER_SIZE 256
#define BUFFER_COUNT 2

/* 状态值定义 */
#define UART_STATUS_TIMEOUT 1 /**< 超时状态：操作超时未完成 */
#define UART_STATUS_ERROR 2   /**< 错误状态：传输过程中发生错误 */
#define UART_STATUS_ABORT 3   /**< 中止状态：操作被人为中止 */
/**
 * @brief 串口收发管理器结构体
 *
 * @details 该结构体用于管理UART串口通信的收发操作，包含数据缓冲区、
 *          状态标志和控制信息。可用于DMA或中断方式的串口数据收发。
 *          对于接收和发送操作，使用相同的结构体但实例不同。
 * @param busy 忙状态标志，1表示当前正在进行数据收发，0表示可以开始新的操作
 * @param status 当前状态，见结构体注释中的定义
 * @note   status字段定义如下:
 *         - UART_STATUS_TIMEOUT (1): 超时状态，操作超时未完成
 *         - UART_STATUS_ERROR (2): 错误状态，传输过程中发生错误
 *         - UART_STATUS_ABORT (3): 中止状态，操作被人为中止
 */
typedef struct
{
    uint8_t buf[BUFFER_SIZE]; /**< 数据缓冲区，用于存储接收或待发送的数据 */
    uint8_t buf_size;        /**< 当前缓冲区中有效数据的大小（字节数）*/
    uint8_t busy;             /**< 忙状态标志，1表示当前正在进行数据收发，0表示可以开始新的操作 */
    uint8_t status;           /**< 当前状态，见结构体注释中的定义 */
} uart_manager_t;

/* 定义发送和接收管理器 */
extern uart_manager_t uart_rx_manager;
extern uart_manager_t uart_tx_manager;

/* 函数声明 */
void usart0_dma1_init(void);
uint8_t uart0_send_data(uint8_t *data, uint16_t size);
#endif /* UART_OTA_H */